package pe.com.casadesign.dao.impl;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.List;
import java.util.Map;

import javax.sql.DataSource;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.core.JdbcTemplate;
import org.springframework.jdbc.core.RowMapper;
import org.springframework.jdbc.core.namedparam.MapSqlParameterSource;
import org.springframework.jdbc.core.namedparam.SqlParameterSource;
import org.springframework.jdbc.core.simple.SimpleJdbcCall;
import org.springframework.stereotype.Repository;

import pe.com.casadesign.dao.VentaDAO;
import pe.com.casadesign.domain.Cliente;
import pe.com.casadesign.domain.Diseniador;
import pe.com.casadesign.domain.Distrito;
import pe.com.casadesign.domain.FormaVenta;
import pe.com.casadesign.domain.Item;
import pe.com.casadesign.domain.LineaFacturacion;
import pe.com.casadesign.domain.LineaVenta;
import pe.com.casadesign.domain.LineaVentaItem;
import pe.com.casadesign.domain.ListaLineaVenta;
import pe.com.casadesign.domain.ListaLineaVentaItem;
import pe.com.casadesign.domain.ListaVenta;
import pe.com.casadesign.domain.Moneda;
import pe.com.casadesign.domain.NivelColor;
import pe.com.casadesign.domain.NivelMaterial;
import pe.com.casadesign.domain.NivelProducto;
import pe.com.casadesign.domain.NivelTipo;
import pe.com.casadesign.domain.Producto;
import pe.com.casadesign.domain.Tienda;
import pe.com.casadesign.domain.TipoDocumentoVenta;
import pe.com.casadesign.domain.Usuario;
import pe.com.casadesign.domain.Venta;
import pe.com.casadesign.domain.Facturacion;
import pe.com.casadesign.domain.ListaFacturacion;
import pe.com.casadesign.domain.ListaLineaFacturacion;

/**
 * Implementacion de VentaDAO.
 * 
 * @author Pedro Vera
 * 
 */
@Repository
public class VentaDAOImpl implements VentaDAO {
	private static final Logger logger = LoggerFactory.getLogger(VentaDAOImpl.class);

	// Nombre Procedimientos Almacenados
	private static String SP_LISTAR_VENTA = "SP_LISTAR_VENTA";
	private static String SP_OBTENER_VENTA = "SP_OBTENER_VENTA";
	private static String SP_BUSCAR_VENTA = "SP_BUSCAR_VENTA";
	private static String SP_REGISTRAR_VENTA = "SP_REGISTRAR_VENTA";
	private static String SP_REGISTRAR_DET_VENTA = "SP_REGISTRAR_DET_VENTA";
	private static String SP_REGISTRAR_DET_VENTA_ITEM = "SP_REGISTRAR_DET_VENTA_ITEM";
	private static String SP_ACTUALIZAR_ESTADO_ITEM = "SP_ACTUALIZAR_ESTADO_ITEM";
	private static String SP_MODIFICAR_VENTA = "SP_MODIFICAR_VENTA";
	private static String SP_ACTUALIZAR_VENTA = "SP_ACTUALIZAR_VENTA";
	private static String SP_LIMPIAR_VENTA_DETALLE = "SP_LIMPIAR_VENTA_DETALLE";
	
	private static String SP_LISTAR_FACTURA = "SP_LISTAR_FACTURA";
	private static String SP_OBTENER_FACTURA = "SP_OBTENER_FACTURA";
	private static String SP_BUSCAR_FACTURA = "SP_BUSCAR_FACTURA";
	private static String SP_REGISTRAR_FACTURA = "SP_REGISTRAR_FACTURA";
	private static String SP_REGISTRAR_DET_FACTURA = "SP_REGISTRAR_DET_FACTURA";
	private static String SP_MODIFICAR_FACTURA = "SP_MODIFICAR_FACTURA";
		
	// Parametros de Entrada
	private static String PARAM_CODVENTA = "p_codventa";
	private static String PARAM_SERIE = "p_serie";
	private static String PARAM_NUMERO = "p_numero";
	private static String PARAM_CODCLIENTE = "p_codcliente";
	private static String PARAM_CODTIPODOCUMENTOVENTA = "p_codtipodocumentoventa";
	private static String PARAM_CODMONEDA = "p_codmoneda";
	private static String PARAM_CODFORMAVENTA = "p_codformaventa";
	private static String PARAM_TOTAL = "p_total";
	private static String PARAM_SUBTOTAL = "p_subtotal";
	private static String PARAM_IGV = "p_igv";
	private static String PARAM_CODUSUARIO = "p_codusuario";
	private static String PARAM_ESTADO = "p_estado";
	private static String PARAM_CODTIENDA = "p_codtienda";
	private static String PARAM_CODDISENIADOR = "p_coddiseniador";
	private static String PARAM_NOTACREDITOSERIE = "p_seriencredito";
	private static String PARAM_NOTACREDITONUMERO = "p_numeroncredito";
	private static String PARAM_SALDO = "p_saldo";
	
	private static String PARAM_DET_NROLINEA = "p_nrolinea";
	private static String PARAM_DET_CODPRODUCTO = "p_codproducto";
	private static String PARAM_DET_CANTIDAD = "p_cantidad";
	private static String PARAM_DET_PRECIO = "p_precio";
	private static String PARAM_DET_NROLINEA_SALIDA = "p_nrolineasalida";
	
	private static String PARAM_ITEM_CODITEM = "p_coditem";
	private static String PARAM_ITEM_ESTADO = "p_estado";
	
	private static String PARAM_FACTURA_CODFACTURA = "p_codfactura";
	private static String PARAM_FACTURA_TOTALFACTURA = "p_totalfactura";
	private static String PARAM_FACTURA_IGVFACTURA = "p_igvfactura";
	private static String PARAM_FACTURA_DETALLELINEA = "p_descripcion";
	
	// Parametros de Salida
	private static String CODVENTA = "CODVENTA";
	private static String SERIE = "SERIE";
	private static String NUMERO = "NUMERO";
	private static String CODCLIENTE = "CODCLIENTE";
	private static String CODTIPODOCUMENTOVENTA = "CODTIPODOCUMENTOVENTA";
	private static String CODMONEDA = "CODMONEDA";
	private static String MONEDA = "DESMONEDA";
	private static String SIMBOLO = "SIMBOLO";
	private static String CODFORMAVENTA = "CODFORMAVENTA";
	private static String DESFORMAVENTA = "FORMAVENTA";
	private static String TOTAL = "TOTAL";
	private static String SUBTOTAL = "SUBTOTAL";
	private static String IGV = "IGV";
	private static String CODUSUARIO = "CODUSUARIO";
	private static String ESTADO = "ESTADO";
	private static String FECHAREGISTRO = "FECHAREGISTRO";
	private static String CODTIENDA = "CODTIENDA";
	private static String NOMBRETIENDA = "NOMBRE";
	private static String NOTACREDITOSERIE = "SERIENCREDITO";
	private static String NOTACREDITONUMERO = "NUMERONCREDITO";
	private static String SALDO = "SALDO";
	
	private static String CODDISENIADOR = "CODDISENIADOR";
	private static String DISENIADOR_NOMBRESYAPELLIDOS = "DISENIADORNOMBRE";
	
	private static String TIPO_DOCUMENTO_VENTA_DESCRIPCION = "DESTIPODOCUMENTOVENTA";
	
	private static String CLIENTE_NRODOCUMENTO = "NRODOCUMENTO";
	private static String CLIENTE_RAZONSOCIAL = "RAZONSOCIAL";
	private static String CLIENTE_DIRECCION = "DIRECCION";
	private static String CLIENTE_RUC = "RUC";
	
	
	private static String USUARIO_NOMBRESYAPELLIDOS = "NOMBRESYAPELLIDOS";
	
	private static String DET_NROLINEA = "NROLINEA";
	private static String DET_CODPRODUCTO = "CODPRODUCTO";
	private static String DET_CODPRODUCTOPROVEEDOR = "CODPRODUCTOPROVEEDOR";
	private static String DET_CANTIDAD = "CANTIDAD";
	private static String DET_PRECIO = "PRECIO";
	private static String DET_CODNIVELPROD = "CODNIVELPROD";
	private static String DET_CODNIVELTIPO = "CODNIVELTIPO";
	private static String DET_CODNIVELMATERIAL = "CODNIVELMATERIAL";
	private static String DET_CODNIVELCOLOR = "CODNIVELCOLOR";
	private static String DET_NIVELPRODUCTODESCRIPCION = "NIVELPRODUCTODESCRIPCION";
	private static String DET_TIPODESCRIPCION = "TIPODESCRIPCION";
	private static String DET_MATERIALDESCRIPCION = "MATERIALDESCRIPCION";
	private static String DET_COLORDESCRIPCION = "COLORDESCRIPCION";
	
	private static String ITEM_CODITEM = "CODITEM";
	private static String ITEM_CODIFICACION = "CODIFICACION";
	private static String ITEM_PRECIOCOMPRA = "PRECIOCOMPRA";
	private static String ITEM_CODMONEDA = "CODMONEDA";
	private static String ITEM_CODTIENDA ="CODTIENDA";
	private static String ITEM_ESTADO ="ESTADO";

	private static String PRODUCTO_DESCRIPCION = "PRODUCTODESCRIPCION";
	
	private static String FACTURACION_CODFACTURACION = "CODFACTURACION";
	private static String FACTURACION_CODVENTA = "CODVENTA";
	private static String FACTURACION_SERIE = "SERIE";
	private static String FACTURACION_NUMERO = "NUMERO";
	private static String FACTURACION_CODTIPODOCUMENTOVENTA = "CODTIPODOCUMENTOVENTA";
	private static String FACTURACION_CODMONEDA = "CODMONEDA";
	private static String FACTURACION_MONEDA = "DESMONEDA";
	private static String FACTURACION_SIMBOLO = "SIMBOLO";
	private static String FACTURACION_CODFORMAVENTA = "CODFORMAVENTA";
	private static String FACTURACION_DESFORMAVENTA = "FORMAVENTA";
	private static String FACTURACION_TOTAL = "TOTALFACTURACION";
	private static String FACTURACION_SUBTOTAL = "SUBTOTALFACTURACION";
	private static String FACTURACION_IGV = "IGVFACTURACION";
	private static String FACTURACION_CODUSUARIO = "CODUSUARIO";
	private static String FACTURACION_ESTADO = "ESTADO";
	private static String FACTURACION_FECHAREGISTRO = "FECHAREGISTRO";
	private static String FACTURACION_CODTIENDA = "CODTIENDA";
	private static String FACTURACION_NOMBRETIENDA = "NOMBRE";
	
	private static String FACTURACION_NROLINEA = "NROLINEAFACTURA";
	private static String FACTURACION_DETALLELINEA = "DESCRIPCIONFACTURA"; 
	private static String FACTURACION_PRECIO ="PRECIOFACTURA"; 
	private static String FACTURACION_CANTIDAD = "CANTIDADFACTURA";
	
	private static String LISTADO = "LISTADO";
	private static String LISTADO_LINEAS = "LISTADO_LINEAS";
	private static String LISTADO_LINEAS_ITEM = "LISTADO_LINEAS_ITEM";
	private static String LISTADO_LINEAS_FACTURACION = "LISTADO_LINEAS_FACTURACION";
	private static String LISTADO_LINEAS_DETFACTURACION = "LISTADO_LINEAS_DETFACTURACION";
	
	private static String TOTAL_FILAS_AFECTADAS = "#update-count-1";
	
	private JdbcTemplate jdbcTemplate;

	@Autowired
    public void setDataSource(DataSource dataSource)
    {
        this.jdbcTemplate = new JdbcTemplate(dataSource);
    }
	
	@Override
	public ListaVenta listarVenta(Venta venta) {
		logger.info("listarVenta");

		// Instanciando variable para llamado de SP
	    SimpleJdbcCall llamarSP = new SimpleJdbcCall(jdbcTemplate).withProcedureName(SP_LISTAR_VENTA).
	    						  returningResultSet(LISTADO, new RowMapper<Venta>(){
									@Override
									public Venta mapRow(final ResultSet rs, final int numRow) throws SQLException
								    {
								        final Venta venta = new Venta();
								        venta.setCodVenta(rs.getInt(CODVENTA));
								        venta.setSerie(rs.getString(SERIE));
								        venta.setNumero(rs.getString(NUMERO));
								        venta.setSaldo(rs.getDouble(SALDO));
								        
								        Cliente cliente =  new Cliente();
								        cliente.setCodCliente(rs.getInt(CODCLIENTE));
								        cliente.setNroDocumento(rs.getString(CLIENTE_NRODOCUMENTO));
								        cliente.setRazonSocial(rs.getString(CLIENTE_RAZONSOCIAL));
								        venta.setCliente(cliente);
								        
								        Usuario usuario = new Usuario();
								        usuario.setCodUsuario(rs.getInt(CODUSUARIO));
								        usuario.setNombresyApellidos(rs.getString(USUARIO_NOMBRESYAPELLIDOS));
								        venta.setUsuario(usuario);
								        
								        TipoDocumentoVenta tipoDocumentoVenta =  new TipoDocumentoVenta();
								        tipoDocumentoVenta.setCodigo(rs.getInt(CODTIPODOCUMENTOVENTA));
								        tipoDocumentoVenta.setDescripcion(rs.getString(TIPO_DOCUMENTO_VENTA_DESCRIPCION));
								        venta.setTipoDocumentoVenta(tipoDocumentoVenta);
								        
								        Moneda moneda = new  Moneda();
								        moneda.setCodigo(rs.getInt(CODMONEDA));
								    	venta.setMoneda(moneda);
								    	
								    	FormaVenta formaVenta = new FormaVenta();
								    	formaVenta.setCodigo(rs.getInt(CODFORMAVENTA));
								    	venta.setFormaVenta(formaVenta);
								    	
								    	venta.setTotal(rs.getDouble(TOTAL));
								    	venta.setSubTotal(rs.getDouble(SUBTOTAL));
								    	venta.setIgv(rs.getDouble(IGV));
								        
								        venta.setEstado(rs.getString(ESTADO));
								        venta.setFechaRegistro(rs.getDate(FECHAREGISTRO).toString());
								        venta.setNotaCreditoNumero(rs.getString(NOTACREDITONUMERO));
								        venta.setNotaCreditoSerie(rs.getString(NOTACREDITOSERIE));
								        
								        Tienda tienda= new Tienda();
								        tienda.setCodigo(rs.getInt(CODTIENDA));
								        tienda.setNombre(rs.getString(NOMBRETIENDA));
								        venta.setTienda(tienda);
								        
								        Diseniador diseniador = new Diseniador();
								        diseniador.setCodDiseniador(rs.getInt(CODDISENIADOR));
								        diseniador.setNombresyApellidos(rs.getString(DISENIADOR_NOMBRESYAPELLIDOS));
								        venta.setDiseniador(diseniador);
								        
								        return venta;
								    }
	    						  }
								);

	    // Estableciendo parametros de entrada al SP
	    SqlParameterSource parametros = new MapSqlParameterSource()
	    								.addValue(PARAM_CODVENTA, venta.getCodVenta())
	    								.addValue(PARAM_CODCLIENTE, venta.getCliente().getCodCliente())
	    								.addValue(PARAM_ESTADO, venta.getEstado()); 

	    // Establecer parametros y ejecutar SP
        Map<String,Object> data = llamarSP.execute(parametros);

        // Obteniendo lista generada de ejecutar SP
		@SuppressWarnings("unchecked")
		List<Venta> listaVenta = (List<Venta>)data.get(LISTADO);
        
		// Instanciando objeto ListaVenta
		ListaVenta listaVentaResultado = new ListaVenta();
        // Estableciendo resultado al objeto listaVentaResultado
		listaVentaResultado.setLista(listaVenta);
        
        if (logger.isDebugEnabled() && listaVentaResultado != null)
        {
            logger.debug("size=" + listaVentaResultado.size());
        }
        
        return listaVentaResultado;
	}

	@Override
	public Venta obtenerVenta(Venta venta) {
		logger.info("obtenerVenta");

		// Instanciando variable para llamado de SP
	    SimpleJdbcCall llamarSP = new SimpleJdbcCall(jdbcTemplate).withProcedureName(SP_OBTENER_VENTA).
	    						  returningResultSet(LISTADO, new RowMapper<Venta>(){
									@Override
									public Venta mapRow(final ResultSet rs, final int numRow) throws SQLException
								    {
										final Venta venta = new Venta();
								        venta.setCodVenta(rs.getInt(CODVENTA));
								        venta.setSerie(rs.getString(SERIE));
								        venta.setNumero(rs.getString(NUMERO));
								        venta.setSaldo(rs.getDouble(SALDO));
								        
								        Cliente cliente =  new Cliente();
								        cliente.setCodCliente(rs.getInt(CODCLIENTE));
								        cliente.setNroDocumento(rs.getString(CLIENTE_NRODOCUMENTO));
								        cliente.setRazonSocial(rs.getString(CLIENTE_RAZONSOCIAL));
								        cliente.setDireccion(rs.getString(CLIENTE_DIRECCION));
								        cliente.setRuc(rs.getString(CLIENTE_RUC));
								        venta.setCliente(cliente);
								        							        
								        Usuario usuario = new Usuario();
								        usuario.setCodUsuario(rs.getInt(CODUSUARIO));
								        usuario.setNombresyApellidos(rs.getString(USUARIO_NOMBRESYAPELLIDOS));
								        venta.setUsuario(usuario);
								        
								        TipoDocumentoVenta tipoDocumentoVenta =  new TipoDocumentoVenta();
								        tipoDocumentoVenta.setCodigo(rs.getInt(CODTIPODOCUMENTOVENTA));
								        tipoDocumentoVenta.setDescripcion(rs.getString(TIPO_DOCUMENTO_VENTA_DESCRIPCION));
								        venta.setTipoDocumentoVenta(tipoDocumentoVenta);
								        
								        Moneda moneda = new Moneda();
								        moneda.setCodigo(rs.getInt(CODMONEDA));
								        moneda.setDescripcion(rs.getString(MONEDA));
								        moneda.setSimbolo(rs.getString(SIMBOLO));
								    	venta.setMoneda(moneda);
								    	
								    	FormaVenta formaVenta = new FormaVenta();
								    	formaVenta.setCodigo(rs.getInt(CODFORMAVENTA));
								    	formaVenta.setDescripcion(rs.getString(DESFORMAVENTA));
								    	venta.setFormaVenta(formaVenta);
								    	
								    	venta.setTotal(rs.getDouble(TOTAL));
								    	venta.setSubTotal(rs.getDouble(SUBTOTAL));
								    	venta.setIgv(rs.getDouble(IGV));
								    	venta.setNotaCreditoNumero(rs.getString(NOTACREDITONUMERO));
								        venta.setNotaCreditoSerie(rs.getString(NOTACREDITOSERIE));
								        
								        venta.setEstado(rs.getString(ESTADO));
								        venta.setFechaRegistro(rs.getDate(FECHAREGISTRO).toString());
								        
								        Tienda tienda= new Tienda();
								        tienda.setCodigo(rs.getInt(CODTIENDA));
								        tienda.setNombre(rs.getString(NOMBRETIENDA));
								        venta.setTienda(tienda);
								       
								        Diseniador diseniador = new Diseniador();
								        diseniador.setCodDiseniador(rs.getInt(CODDISENIADOR));
								        diseniador.setNombresyApellidos(rs.getString(DISENIADOR_NOMBRESYAPELLIDOS));
								        venta.setDiseniador(diseniador);
								        
								        return venta;
								    }
	    						  }
								)
								.returningResultSet(LISTADO_LINEAS, new RowMapper<LineaVenta>(){
									@Override
									public LineaVenta mapRow(final ResultSet rs, final int numRow) throws SQLException
								    {
								        final LineaVenta lineaVenta = new LineaVenta();
								        lineaVenta.setNumeroLinea(rs.getInt(DET_NROLINEA));
								        lineaVenta.setCodVenta(rs.getInt(CODVENTA));
								        
								        Producto producto = new Producto();
								        producto.setCodigo(rs.getInt(DET_CODPRODUCTO));
								        producto.setCodProductoProveedor(rs.getString(DET_CODPRODUCTOPROVEEDOR));
								        producto.setDescripcion(rs.getString(PRODUCTO_DESCRIPCION));
								        
								        NivelProducto nivelProducto = new NivelProducto();
								        nivelProducto.setCodigo(rs.getInt(DET_CODNIVELPROD));
								        nivelProducto.setDescripcion(rs.getString(DET_NIVELPRODUCTODESCRIPCION));
								        producto.setNivelProducto(nivelProducto);
								        
								        NivelColor nivelColor = new NivelColor();
								        nivelColor.setCodigo(rs.getInt(DET_CODNIVELCOLOR));
								        nivelColor.setCodNivelProducto(rs.getInt(DET_CODNIVELPROD));
								        nivelColor.setDescripcion(rs.getString(DET_COLORDESCRIPCION));
								        producto.setNivelColor(nivelColor);
								        
								        NivelTipo nivelTipo = new NivelTipo();
								        nivelTipo.setCodigo(rs.getInt(DET_CODNIVELTIPO));
								        nivelTipo.setCodNivelProducto(rs.getInt(DET_CODNIVELPROD));
								        nivelTipo.setDescripcion(rs.getString(DET_TIPODESCRIPCION));
								        producto.setNivelTipo(nivelTipo);
								        
								        NivelMaterial nivelMaterial = new NivelMaterial();
								        nivelMaterial.setCodigo(rs.getInt(DET_CODNIVELMATERIAL));
								        nivelMaterial.setCodNivelProducto(rs.getInt(DET_CODNIVELPROD));
								        nivelMaterial.setDescripcion(rs.getString(DET_MATERIALDESCRIPCION));
								        producto.setNivelMaterial(nivelMaterial);
								        
								        lineaVenta.setProducto(producto);
								        
								        lineaVenta.setPrecio(rs.getDouble(DET_PRECIO));
								        lineaVenta.setCantidad(rs.getInt(DET_CANTIDAD));
								        
								        return lineaVenta;
								    }
	    						  })
	    						  .returningResultSet(LISTADO_LINEAS_ITEM, new RowMapper<LineaVentaItem>(){
										@Override
										public LineaVentaItem mapRow(final ResultSet rs, final int numRow) throws SQLException
									    {
									        final LineaVentaItem lineaVentaItem = new LineaVentaItem();
									        lineaVentaItem.setNumeroLinea(rs.getInt(DET_NROLINEA));
									        lineaVentaItem.setCodVenta(rs.getInt(CODVENTA));
									        
									        Item item = new Item();
									        item.setCodItem(rs.getInt(ITEM_CODITEM));
									        item.setCodificacion(rs.getString(ITEM_CODIFICACION));
									        item.setPrecioCompra(rs.getDouble(ITEM_PRECIOCOMPRA));
									        item.setEstado(rs.getString(ITEM_ESTADO));
									        
									        Tienda tienda = new Tienda();
									        tienda.setCodigo(rs.getInt(ITEM_CODTIENDA));
									        item.setTienda(tienda);
									        
									        Moneda moneda = new Moneda();
									        moneda.setCodigo(rs.getInt(ITEM_CODMONEDA));
									        item.setMoneda(moneda);
									        
									        Producto producto = new Producto();
									        producto.setCodigo(rs.getInt(DET_CODPRODUCTO));
									        producto.setCodProductoProveedor(rs.getString(DET_CODPRODUCTOPROVEEDOR));
									        producto.setDescripcion(rs.getString(PRODUCTO_DESCRIPCION));
									        item.setProducto(producto);
									        
									        lineaVentaItem.setItem(item); 								        
	
									        return lineaVentaItem;
									    }
		    						  })
		    					.returningResultSet(LISTADO_LINEAS_FACTURACION, new RowMapper<Facturacion>(){
									@Override
									public Facturacion mapRow(final ResultSet rs, final int numRow) throws SQLException
								    {
								        final Facturacion facturacion = new Facturacion();
								        facturacion.setCodFactura(rs.getInt(FACTURACION_CODFACTURACION));
								        facturacion.setNumero(rs.getString(FACTURACION_NUMERO));
								        facturacion.setSerie(rs.getString(FACTURACION_SERIE));
								        facturacion.setEstado(rs.getString(FACTURACION_ESTADO));
								        facturacion.setFechaRegistro(rs.getDate(FACTURACION_FECHAREGISTRO).toString());
								        
								        FormaVenta formaVenta = new FormaVenta();
								        formaVenta.setCodigo(rs.getInt(FACTURACION_CODFORMAVENTA));
								        formaVenta.setDescripcion(rs.getString(FACTURACION_DESFORMAVENTA));
								        facturacion.setFormaVenta(formaVenta);
								        
								        Moneda moneda = new Moneda();
								        moneda.setCodigo(rs.getInt(FACTURACION_CODMONEDA));
								        moneda.setDescripcion(rs.getString(FACTURACION_MONEDA));
								        moneda.setSimbolo(rs.getString(FACTURACION_SIMBOLO));
								        facturacion.setMoneda(moneda);
								        
								        facturacion.setTotalFacturacion(rs.getDouble(FACTURACION_TOTAL));
								        facturacion.setSubTotalFacturacion(rs.getDouble(FACTURACION_SUBTOTAL));
								        facturacion.setIgvFacturacion(rs.getDouble(FACTURACION_IGV));
								        
								        TipoDocumentoVenta tipoDocumentoVenta = new TipoDocumentoVenta();
								        tipoDocumentoVenta.setCodigo(rs.getInt(FACTURACION_CODTIPODOCUMENTOVENTA));
								        tipoDocumentoVenta.setDescripcion(rs.getString(TIPO_DOCUMENTO_VENTA_DESCRIPCION));
								        facturacion.setTipoDocumentoVenta(tipoDocumentoVenta);
								        
								        Tienda tiendaFacturacion = new Tienda();
								        tiendaFacturacion.setCodigo(rs.getInt(FACTURACION_CODTIENDA));
								        tiendaFacturacion.setDescripcion(rs.getString(FACTURACION_NOMBRETIENDA));
								        facturacion.setTiendaFacturacion(tiendaFacturacion);
								        
								        Usuario usuario = new Usuario();
								        usuario.setCodUsuario(rs.getInt(FACTURACION_CODUSUARIO));
								        usuario.setNombresyApellidos(rs.getString(USUARIO_NOMBRESYAPELLIDOS));
								        facturacion.setUsuario(usuario);
								        
								        return facturacion;
								    }
		    						  })
		    					.returningResultSet(LISTADO_LINEAS_DETFACTURACION, new RowMapper<LineaFacturacion>(){
										@Override
										public LineaFacturacion mapRow(final ResultSet rs, final int numRow) throws SQLException
									    {
									        final LineaFacturacion lineaFacturacion = new LineaFacturacion();
									        
									        lineaFacturacion.setCodFactura(rs.getInt(FACTURACION_CODFACTURACION));
									        lineaFacturacion.setNumeroLinea(rs.getInt(FACTURACION_NROLINEA));
									        lineaFacturacion.setDescripcion(rs.getString(FACTURACION_DETALLELINEA));
									        lineaFacturacion.setCantidad(rs.getInt(FACTURACION_CANTIDAD));
									        lineaFacturacion.setPrecio(rs.getDouble(FACTURACION_PRECIO));
									        
									        return lineaFacturacion;
									    }
		    					});

	    // Estableciendo parametros de entrada al SP
	    SqlParameterSource parametros = new MapSqlParameterSource()
	    								.addValue(PARAM_CODVENTA, venta.getCodVenta()); 

	    // Establecer parametros y ejecutar SP
        Map<String,Object> data = llamarSP.execute(parametros);

        // Obteniendo lista generada de ejecutar SP
		@SuppressWarnings("unchecked")
		List<Venta> listaVenta = (List<Venta>)data.get(LISTADO);
        
		// Declarando objeto venta Obtenido
 		Venta ventaObtenido = null;
 		
 		if (logger.isDebugEnabled() && listaVenta != null)
        {
            logger.debug("size=" + listaVenta.size());
        }
		
 		if (listaVenta != null && listaVenta.size()>0){
 			// Obteniendo el primer elemento de la lista de venta
 			ventaObtenido = listaVenta.get(0);
 		
	        // Obteniendo lista de lineas generada de ejecutar SP
			@SuppressWarnings("unchecked")
			List<LineaVenta> listaLineaVenta = (List<LineaVenta>)data.get(LISTADO_LINEAS);
	        
			// Instanciando objeto ListaLineaVenta
			ListaLineaVenta listaLineaVentaResultado = new ListaLineaVenta();
	        // Estableciendo resultado al objeto listaLineaVentaResultado
			listaLineaVentaResultado.setLista(listaLineaVenta);
	        
			// --------------------------------------------------------------------------------------------
			// Obteniendo lista de lineas-item generada de ejecutar SP
			@SuppressWarnings("unchecked")
			List<LineaVentaItem> listaLineaVentaItem = (List<LineaVentaItem>)data.get(LISTADO_LINEAS_ITEM);
			
			for (LineaVenta lineaVenta : listaLineaVentaResultado.getLista()){
				
				// Instanciando objeto ListaLineaVentaItem
				ListaLineaVentaItem listaLineaVentaItemResultado =  new ListaLineaVentaItem();
				
				for(LineaVentaItem lineaVentaItem : listaLineaVentaItem){
					if( lineaVentaItem.getNumeroLinea() == lineaVenta.getNumeroLinea()){
						listaLineaVentaItemResultado.add(lineaVentaItem);
					}
				}
			
				if(listaLineaVentaItemResultado.size()>0){
					lineaVenta.setListaLineaVentaItem(listaLineaVentaItemResultado);
				}
			}
			// --------------------------------------------------------------------------------------------
			
			// Asignando lista de lineas al objeto venta creado
			ventaObtenido.setListaLineaVenta(listaLineaVentaResultado);
			
			// --------------------------------------------------------------------------------------------
			// Obteniendo lista de lineas generada de ejecutar SP
			@SuppressWarnings("unchecked")
			List<Facturacion> listaFacturacion = (List<Facturacion>)data.get(LISTADO_LINEAS_FACTURACION);
				        
			// Instanciando objeto listaLineaFacturacion
			ListaFacturacion listaFacturacionResultado = new ListaFacturacion();
			// Estableciendo resultado al objeto listaLineaFacturacionResultado
			listaFacturacionResultado.setLista(listaFacturacion);
			// --------------------------------------------------------------------------------------------
			
			// Obteniendo lista de lineas-facturacion generada de ejecutar SP
			@SuppressWarnings("unchecked")
			List<LineaFacturacion> listaLineaFacturacion = (List<LineaFacturacion>)data.get(LISTADO_LINEAS_DETFACTURACION);

			for (Facturacion facturacion : listaFacturacionResultado.getLista()){

				// Instanciando objeto ListaLineaVentaItem
				ListaLineaFacturacion listaLineaFacturacionResultado =  new ListaLineaFacturacion();

				for(LineaFacturacion lineaFacturacion : listaLineaFacturacion){
					if( lineaFacturacion.getCodFactura() == facturacion.getCodFactura()){
						listaLineaFacturacionResultado.add(lineaFacturacion);
					}
				}

				if(listaLineaFacturacionResultado.size()>0){
					facturacion.setListaLineaFacturacion(listaLineaFacturacionResultado);
				}
			}
			// --------------------------------------------------------------------------------------------
			// Asignando lista de facturas al objeto venta creado
			
			ventaObtenido.setListaFacturacion(listaFacturacionResultado);
						
			// --------------------------------------------------------------------------------------------
	        if (logger.isDebugEnabled() && listaLineaVentaResultado != null)
	        {
	            logger.debug("sizeLineas=" + listaLineaVentaResultado.size());
	        }
 		}

		return ventaObtenido;
	}
	
	@Override
	public Venta buscarVenta(Venta venta) {
		logger.info("buscarVenta");

		// Instanciando variable para llamado de SP
	    SimpleJdbcCall llamarSP = new SimpleJdbcCall(jdbcTemplate).withProcedureName(SP_BUSCAR_VENTA).
	    						  returningResultSet(LISTADO, new RowMapper<Venta>(){
									@Override
									public Venta mapRow(final ResultSet rs, final int numRow) throws SQLException
								    {
								        final Venta venta = new Venta();
								        venta.setCodVenta(rs.getInt(CODVENTA));
								        venta.setSerie(rs.getString(SERIE));
								        venta.setNumero(rs.getString(NUMERO));
								        venta.setSaldo(rs.getDouble(SALDO));
								        
								        Cliente cliente =  new Cliente();
								        cliente.setCodCliente(rs.getInt(CODCLIENTE));
								        cliente.setNroDocumento(rs.getString(CLIENTE_NRODOCUMENTO));
								        cliente.setRazonSocial(rs.getString(CLIENTE_RAZONSOCIAL));
								        cliente.setDireccion(rs.getString(CLIENTE_DIRECCION));
								        venta.setCliente(cliente);
								        
								        Usuario usuario = new Usuario();
								        usuario.setCodUsuario(rs.getInt(CODUSUARIO));
								        usuario.setNombresyApellidos(rs.getString(USUARIO_NOMBRESYAPELLIDOS));
								        venta.setUsuario(usuario);
								        
								        TipoDocumentoVenta tipoDocumentoVenta =  new TipoDocumentoVenta();
								        tipoDocumentoVenta.setCodigo(rs.getInt(CODTIPODOCUMENTOVENTA));
								        tipoDocumentoVenta.setDescripcion(rs.getString(TIPO_DOCUMENTO_VENTA_DESCRIPCION));
								        venta.setTipoDocumentoVenta(tipoDocumentoVenta);
								        
								        Moneda moneda = new Moneda();
								        moneda.setCodigo(rs.getInt(CODMONEDA));
								        moneda.setDescripcion(rs.getString(MONEDA));
								        moneda.setSimbolo(rs.getString(SIMBOLO));
								    	venta.setMoneda(moneda);
								    	
								    	FormaVenta formaVenta = new FormaVenta();
								    	formaVenta.setCodigo(rs.getInt(CODFORMAVENTA));
								    	formaVenta.setDescripcion(rs.getString(DESFORMAVENTA));
								    	venta.setFormaVenta(formaVenta);
								    	
								    	venta.setTotal(rs.getDouble(TOTAL));
								    	venta.setSubTotal(rs.getDouble(SUBTOTAL));
								    	venta.setIgv(rs.getDouble(IGV));
								    	venta.setNotaCreditoNumero(rs.getString(NOTACREDITONUMERO));
								        venta.setNotaCreditoSerie(rs.getString(NOTACREDITOSERIE));
								        
								        venta.setEstado(rs.getString(ESTADO));
								        venta.setFechaRegistro(rs.getDate(FECHAREGISTRO).toString());
								        
								        Tienda tienda= new Tienda();
								        tienda.setCodigo(rs.getInt(CODTIENDA));
								        tienda.setNombre(rs.getString(NOMBRETIENDA));
								        venta.setTienda(tienda);
								       
								        Diseniador diseniador = new Diseniador();
								        diseniador.setCodDiseniador(rs.getInt(CODDISENIADOR));
								        diseniador.setNombresyApellidos(rs.getString(DISENIADOR_NOMBRESYAPELLIDOS));
								        venta.setDiseniador(diseniador);
								        
								        return venta;
								    }
	    						  }
								)
								.returningResultSet(LISTADO_LINEAS, new RowMapper<LineaVenta>(){
									@Override
									public LineaVenta mapRow(final ResultSet rs, final int numRow) throws SQLException
								    {
								        final LineaVenta lineaVenta = new LineaVenta();
								        lineaVenta.setNumeroLinea(rs.getInt(DET_NROLINEA));
								        lineaVenta.setCodVenta(rs.getInt(CODVENTA));
								        
								        Producto producto = new Producto();
								        producto.setCodigo(rs.getInt(DET_CODPRODUCTO));
								        producto.setCodProductoProveedor(rs.getString(DET_CODPRODUCTOPROVEEDOR));
								        producto.setDescripcion(rs.getString(PRODUCTO_DESCRIPCION));
								        
								        NivelProducto nivelProducto = new NivelProducto();
								        nivelProducto.setCodigo(rs.getInt(DET_CODNIVELPROD));
								        nivelProducto.setDescripcion(rs.getString(DET_NIVELPRODUCTODESCRIPCION));
								        producto.setNivelProducto(nivelProducto);
								        
								        NivelColor nivelColor = new NivelColor();
								        nivelColor.setCodigo(rs.getInt(DET_CODNIVELCOLOR));
								        nivelColor.setCodNivelProducto(rs.getInt(DET_CODNIVELPROD));
								        nivelColor.setDescripcion(rs.getString(DET_COLORDESCRIPCION));
								        producto.setNivelColor(nivelColor);
								        
								        NivelTipo nivelTipo = new NivelTipo();
								        nivelTipo.setCodigo(rs.getInt(DET_CODNIVELTIPO));
								        nivelTipo.setCodNivelProducto(rs.getInt(DET_CODNIVELPROD));
								        nivelTipo.setDescripcion(rs.getString(DET_TIPODESCRIPCION));
								        producto.setNivelTipo(nivelTipo);
								        
								        NivelMaterial nivelMaterial = new NivelMaterial();
								        nivelMaterial.setCodigo(rs.getInt(DET_CODNIVELMATERIAL));
								        nivelMaterial.setCodNivelProducto(rs.getInt(DET_CODNIVELPROD));
								        nivelMaterial.setDescripcion(rs.getString(DET_MATERIALDESCRIPCION));
								        producto.setNivelMaterial(nivelMaterial);
								        
								        lineaVenta.setProducto(producto);
								        
								        lineaVenta.setPrecio(rs.getDouble(DET_PRECIO));
								        lineaVenta.setCantidad(rs.getInt(DET_CANTIDAD));
								        
								        return lineaVenta;
								    }
	    						  })
	    						  .returningResultSet(LISTADO_LINEAS_ITEM, new RowMapper<LineaVentaItem>(){
										@Override
										public LineaVentaItem mapRow(final ResultSet rs, final int numRow) throws SQLException
									    {
									        final LineaVentaItem lineaVentaItem = new LineaVentaItem();
									        lineaVentaItem.setNumeroLinea(rs.getInt(DET_NROLINEA));
									        lineaVentaItem.setCodVenta(rs.getInt(CODVENTA));
									        
									        Item item = new Item();
									        item.setCodItem(rs.getInt(ITEM_CODITEM));
									        item.setCodificacion(rs.getString(ITEM_CODIFICACION));
									        item.setPrecioCompra(rs.getDouble(ITEM_PRECIOCOMPRA));
									        item.setEstado(rs.getString(ITEM_ESTADO));
									        
									        Tienda tienda = new Tienda();
									        tienda.setCodigo(rs.getInt(ITEM_CODTIENDA));
									        item.setTienda(tienda);
									        
									        Moneda moneda = new Moneda();
									        moneda.setCodigo(rs.getInt(ITEM_CODMONEDA));
									        item.setMoneda(moneda);
									        
									        Producto producto = new Producto();
									        producto.setCodigo(rs.getInt(DET_CODPRODUCTO));
									        producto.setCodProductoProveedor(rs.getString(DET_CODPRODUCTOPROVEEDOR));
									        producto.setDescripcion(rs.getString(PRODUCTO_DESCRIPCION));
									        item.setProducto(producto);
									        
									        lineaVentaItem.setItem(item); 								        
	
									        return lineaVentaItem;
									    }
		    						  })
				    					.returningResultSet(LISTADO_LINEAS_FACTURACION, new RowMapper<Facturacion>(){
											@Override
											public Facturacion mapRow(final ResultSet rs, final int numRow) throws SQLException
										    {
										        final Facturacion facturacion = new Facturacion();
										        facturacion.setCodFactura(rs.getInt(FACTURACION_CODFACTURACION));
										        facturacion.setNumero(rs.getString(FACTURACION_NUMERO));
										        facturacion.setSerie(rs.getString(FACTURACION_SERIE));
										        facturacion.setEstado(rs.getString(FACTURACION_ESTADO));
										        facturacion.setFechaRegistro(rs.getDate(FACTURACION_FECHAREGISTRO).toString());
										        
										        FormaVenta formaVenta = new FormaVenta();
										        formaVenta.setCodigo(rs.getInt(FACTURACION_CODFORMAVENTA));
										        formaVenta.setDescripcion(rs.getString(FACTURACION_DESFORMAVENTA));
										        facturacion.setFormaVenta(formaVenta);
										        
										        Moneda moneda = new Moneda();
										        moneda.setCodigo(rs.getInt(FACTURACION_CODMONEDA));
										        moneda.setDescripcion(rs.getString(FACTURACION_MONEDA));
										        moneda.setSimbolo(rs.getString(FACTURACION_SIMBOLO));
										        facturacion.setMoneda(moneda);
										        
										        facturacion.setTotalFacturacion(rs.getDouble(FACTURACION_TOTAL));
										        facturacion.setSubTotalFacturacion(rs.getDouble(FACTURACION_SUBTOTAL));
										        facturacion.setIgvFacturacion(rs.getDouble(FACTURACION_IGV));
										        
										        TipoDocumentoVenta tipoDocumentoVenta = new TipoDocumentoVenta();
										        tipoDocumentoVenta.setCodigo(rs.getInt(FACTURACION_CODTIPODOCUMENTOVENTA));
										        tipoDocumentoVenta.setDescripcion(rs.getString(TIPO_DOCUMENTO_VENTA_DESCRIPCION));
										        facturacion.setTipoDocumentoVenta(tipoDocumentoVenta);
										        
										        Tienda tiendaFacturacion = new Tienda();
										        tiendaFacturacion.setCodigo(rs.getInt(FACTURACION_CODTIENDA));
										        tiendaFacturacion.setDescripcion(rs.getString(FACTURACION_NOMBRETIENDA));
										        facturacion.setTiendaFacturacion(tiendaFacturacion);
										        
										        Usuario usuario = new Usuario();
										        usuario.setCodUsuario(rs.getInt(FACTURACION_CODUSUARIO));
										        usuario.setNombresyApellidos(rs.getString(USUARIO_NOMBRESYAPELLIDOS));
										        facturacion.setUsuario(usuario);
										        
										        return facturacion;
										    }
				    						  })
				    					.returningResultSet(LISTADO_LINEAS_DETFACTURACION, new RowMapper<LineaFacturacion>(){
												@Override
												public LineaFacturacion mapRow(final ResultSet rs, final int numRow) throws SQLException
											    {
											        final LineaFacturacion lineaFacturacion = new LineaFacturacion();
											        
											        lineaFacturacion.setCodFactura(rs.getInt(FACTURACION_CODFACTURACION));
											        lineaFacturacion.setNumeroLinea(rs.getInt(FACTURACION_NROLINEA));
											        lineaFacturacion.setDescripcion(rs.getString(FACTURACION_DETALLELINEA));
											        lineaFacturacion.setCantidad(rs.getInt(FACTURACION_CANTIDAD));
											        lineaFacturacion.setPrecio(rs.getDouble(FACTURACION_PRECIO));
											        
											        return lineaFacturacion;
											    }
				    					});

	    // Estableciendo parametros de entrada al SP
	    SqlParameterSource parametros = new MapSqlParameterSource()
	    								.addValue(PARAM_SERIE, venta.getSerie())
	    								.addValue(PARAM_NUMERO, venta.getNumero())
	    								.addValue(PARAM_CODTIPODOCUMENTOVENTA, venta.getTipoDocumentoVenta().getCodigo());

	    // Establecer parametros y ejecutar SP
        Map<String,Object> data = llamarSP.execute(parametros);

        // Obteniendo lista generada de ejecutar SP
		@SuppressWarnings("unchecked")
		List<Venta> listaVenta = (List<Venta>)data.get(LISTADO);
        
		// Declarando objeto venta Obtenido
 		Venta ventaObtenido = null;
 		
 		if (logger.isDebugEnabled() && listaVenta != null)
        {
            logger.debug("size=" + listaVenta.size());
        }
		
 		if (listaVenta != null && listaVenta.size()>0){
 			// Obteniendo el primer elemento de la lista de venta
 			ventaObtenido = listaVenta.get(0);
 		
	        // Obteniendo lista de lineas generada de ejecutar SP
			@SuppressWarnings("unchecked")
			List<LineaVenta> listaLineaVenta = (List<LineaVenta>)data.get(LISTADO_LINEAS);
	        
			// Instanciando objeto ListaLineaVenta
			ListaLineaVenta listaLineaVentaResultado = new ListaLineaVenta();
	        // Estableciendo resultado al objeto listaLineaVentaResultado
			listaLineaVentaResultado.setLista(listaLineaVenta);
	        
			// --------------------------------------------------------------------------------------------
			// Obteniendo lista de lineas-item generada de ejecutar SP
			@SuppressWarnings("unchecked")
			List<LineaVentaItem> listaLineaVentaItem = (List<LineaVentaItem>)data.get(LISTADO_LINEAS_ITEM);
			
			for (LineaVenta lineaVenta : listaLineaVentaResultado.getLista()){
				
				// Instanciando objeto ListaLineaVentaItem
				ListaLineaVentaItem listaLineaVentaItemResultado =  new ListaLineaVentaItem();
				
				for(LineaVentaItem lineaVentaItem : listaLineaVentaItem){
					if( lineaVentaItem.getNumeroLinea() == lineaVenta.getNumeroLinea()){
						listaLineaVentaItemResultado.add(lineaVentaItem);
					}
				}
			
				if(listaLineaVentaItemResultado.size()>0){
					lineaVenta.setListaLineaVentaItem(listaLineaVentaItemResultado);
				}
			}
			// --------------------------------------------------------------------------------------------
			
			// Asignando lista de lineas al objeto venta creado
			ventaObtenido.setListaLineaVenta(listaLineaVentaResultado);
			
			// --------------------------------------------------------------------------------------------
			// Obteniendo lista de lineas generada de ejecutar SP
			@SuppressWarnings("unchecked")
			List<Facturacion> listaFacturacion = (List<Facturacion>)data.get(LISTADO_LINEAS_FACTURACION);
				        
			// Instanciando objeto listaLineaFacturacion
			ListaFacturacion listaFacturacionResultado = new ListaFacturacion();
			// Estableciendo resultado al objeto listaLineaFacturacionResultado
			listaFacturacionResultado.setLista(listaFacturacion);
			// --------------------------------------------------------------------------------------------
			
			// Obteniendo lista de lineas-facturacion generada de ejecutar SP
			@SuppressWarnings("unchecked")
			List<LineaFacturacion> listaLineaFacturacion = (List<LineaFacturacion>)data.get(LISTADO_LINEAS_DETFACTURACION);

			for (Facturacion facturacion : listaFacturacionResultado.getLista()){

				// Instanciando objeto ListaLineaVentaItem
				ListaLineaFacturacion listaLineaFacturacionResultado =  new ListaLineaFacturacion();

				for(LineaFacturacion lineaFacturacion : listaLineaFacturacion){
					if( lineaFacturacion.getCodFactura() == facturacion.getCodFactura()){
						listaLineaFacturacionResultado.add(lineaFacturacion);
					}
				}

				if(listaLineaFacturacionResultado.size()>0){
					facturacion.setListaLineaFacturacion(listaLineaFacturacionResultado);
				}
			}
			// --------------------------------------------------------------------------------------------
			// Asignando lista de facturas al objeto venta creado
			
			ventaObtenido.setListaFacturacion(listaFacturacionResultado);
						
			// --------------------------------------------------------------------------------------------
			
	        if (logger.isDebugEnabled() && listaLineaVentaResultado != null)
	        {
	            logger.debug("sizeLineas=" + listaLineaVentaResultado.size());
	        }
 		}

		return ventaObtenido;
	}

	@Override
	public boolean registrarVenta(Venta venta) {
		logger.info("registrarVenta");
		
		int resultado = 0;
		
		// Instanciando variable para llamado de SP
	    SimpleJdbcCall llamarSP = new SimpleJdbcCall(jdbcTemplate).withProcedureName(SP_REGISTRAR_VENTA);

	    // Estableciendo parametros de entrada al SP
	    SqlParameterSource parametros = new MapSqlParameterSource()
	    								.addValue(PARAM_SERIE, venta.getSerie())
	    								.addValue(PARAM_NUMERO, venta.getNumero())
	    								.addValue(PARAM_CODCLIENTE, venta.getCliente()==null?null:venta.getCliente().getCodCliente())
	    								.addValue(PARAM_CODTIPODOCUMENTOVENTA, venta.getTipoDocumentoVenta().getCodigo())
	    								.addValue(PARAM_CODMONEDA, venta.getMoneda().getCodigo())
	    								.addValue(PARAM_CODFORMAVENTA, venta.getFormaVenta().getCodigo())
	    								.addValue(PARAM_TOTAL, venta.getTotal())
	    								.addValue(PARAM_SUBTOTAL, venta.getSubTotal())
	    								.addValue(PARAM_IGV, venta.getIgv())
	    								.addValue(PARAM_CODUSUARIO, venta.getUsuario().getCodUsuario())
	    								.addValue(PARAM_ESTADO, venta.getEstado())
	    								.addValue(PARAM_CODTIENDA, venta.getTienda().getCodigo())
	    								.addValue(PARAM_NOTACREDITONUMERO, venta.getNotaCreditoNumero())
	    								.addValue(PARAM_NOTACREDITOSERIE, venta.getNotaCreditoSerie())
	    								.addValue(PARAM_CODDISENIADOR, venta.getDiseniador()==null?null:venta.getDiseniador().getCodDiseniador())
	    								.addValue(PARAM_SALDO, venta.getTotal());
	    
	    
	    // Establecer parametros y ejecutar SP
	    Map<String,Object> data = llamarSP.execute(parametros);
	    
	    // Obteniendo el total de filas afectadas al ejecutar SP
	    resultado += (Integer) data.get(TOTAL_FILAS_AFECTADAS);
	    
	    logger.debug("codigo generado:" + data.get(PARAM_CODVENTA));

	    // Obteniendo codigo de venta
	    int codigoVenta = (Integer)data.get(PARAM_CODVENTA);

	    // Estableciendo codigo generado
	    venta.setCodVenta(codigoVenta);
	    
	    // Obteniendo lineas de la Venta
	    ListaLineaVenta listaLineaVenta = venta.getListaLineaVenta();
	    int iNumeroLinea = 1;
	    for (LineaVenta lineaVenta : listaLineaVenta.getLista()){
	    	// Estableciendo el codigo de venta de la linea
	    	lineaVenta.setCodVenta(venta.getCodVenta());
	    	
	    	// Instanciando variable para llamado de SP
		    SimpleJdbcCall llamarSPLineas = new SimpleJdbcCall(jdbcTemplate).withProcedureName(SP_REGISTRAR_DET_VENTA);
		    // Estableciendo parametros de entrada al SP
		    SqlParameterSource parametrosDetalle = new MapSqlParameterSource()
					    								.addValue(PARAM_CODVENTA, lineaVenta.getCodVenta())
					    								.addValue(PARAM_DET_NROLINEA, iNumeroLinea)
					    								.addValue(PARAM_DET_CODPRODUCTO, lineaVenta.getProducto().getCodigo())
					    								.addValue(PARAM_DET_CANTIDAD, lineaVenta.getCantidad())
					    								.addValue(PARAM_DET_PRECIO, lineaVenta.getPrecio());
		    
		    // Establecer parametros y ejecutar SP
		    Map<String,Object> dataDetalle = llamarSPLineas.execute(parametrosDetalle);
		    
		    // Obteniendo numero de linea
		    //int numeroLinea = (Integer)dataDetalle.get(PARAM_DET_NROLINEA);
		    int numeroLinea = iNumeroLinea;
		    
		    // Obteniendo el total de filas afectadas al ejecutar SP
		    resultado += (Integer) dataDetalle.get(TOTAL_FILAS_AFECTADAS);
		    
		    // Instanciando variable para llamado de SP
		    SimpleJdbcCall llamarSPLineasItem = new SimpleJdbcCall(jdbcTemplate).withProcedureName(SP_REGISTRAR_DET_VENTA_ITEM);
		    
	    	for (LineaVentaItem lineaVentaItem : lineaVenta.getListaLineaVentaItem().getLista()){
	    		// Estableciendo el numero de la linea
	    		lineaVentaItem.setNumeroLinea(numeroLinea);
	    		
	    		// Estableciendo parametros de entrada al SP
			    SqlParameterSource parametrosDetalleItem = new MapSqlParameterSource()
						    								.addValue(PARAM_CODVENTA, lineaVenta.getCodVenta())
						    								.addValue(PARAM_DET_NROLINEA, lineaVentaItem.getNumeroLinea())
						    								.addValue(PARAM_ITEM_CODITEM, lineaVentaItem.getItem().getCodItem());
			    
			    // Establecer parametros y ejecutar SP
			    Map<String,Object> dataDetalleItem = llamarSPLineasItem.execute(parametrosDetalleItem);
			    
			    // Obteniendo el total de filas afectadas al ejecutar SP
			    resultado += (Integer) dataDetalleItem.get(TOTAL_FILAS_AFECTADAS);
			    
			    // Actualizar Item de prestamo
			    resultado += actualizarEstadoItem(lineaVentaItem.getItem());
	    	}
	    	iNumeroLinea ++;
	    }
	    
	    return resultado > 0;
	}
	
	private int actualizarEstadoItem(Item item){
		logger.info("actualizarEstadoItem");
		
		// Instanciando variable para llamado de SP
	    SimpleJdbcCall llamarSP = new SimpleJdbcCall(jdbcTemplate).withProcedureName(SP_ACTUALIZAR_ESTADO_ITEM);

	    // Estableciendo parametros de entrada al SP
	    SqlParameterSource parametros = new MapSqlParameterSource()
	    								.addValue(PARAM_ITEM_CODITEM, item.getCodItem())
	    								.addValue(PARAM_ITEM_ESTADO, item.getEstado());
	    
	    // Establecer parametros y ejecutar SP
	    Map<String,Object> data = llamarSP.execute(parametros);
	    
	    // Obteniendo el total de filas afectadas al ejecutar SP
	    int totalRegistrosAfectado = (Integer) data.get(TOTAL_FILAS_AFECTADAS);
	        
	    return totalRegistrosAfectado;
	}

	public int modificarVenta(Venta venta){
		logger.info("modificarVenta");
		
		// Instanciando variable para llamado de SP
	    SimpleJdbcCall llamarSP = new SimpleJdbcCall(jdbcTemplate).withProcedureName(SP_MODIFICAR_VENTA);

	    // Estableciendo parametros de entrada al SP
	    SqlParameterSource parametros = new MapSqlParameterSource()
	    								.addValue(PARAM_CODVENTA, venta.getCodVenta())
	    								.addValue(PARAM_ESTADO, venta.getEstado())
	    								.addValue(PARAM_CODCLIENTE, venta.getCliente().getCodCliente())
	    								.addValue(PARAM_NOTACREDITONUMERO, venta.getNotaCreditoNumero())
	    								.addValue(PARAM_NOTACREDITOSERIE, venta.getNotaCreditoSerie())
	    								.addValue(PARAM_CODDISENIADOR, venta.getDiseniador()==null?null:venta.getDiseniador().getCodDiseniador())
	    								.addValue(PARAM_NUMERO, venta.getNumero())
	    								.addValue(PARAM_SERIE, venta.getSerie())
	    								.addValue(PARAM_SALDO, venta.getSaldo())
	    								.addValue(PARAM_CODTIPODOCUMENTOVENTA, venta.getTipoDocumentoVenta().getCodigo());
	    
	    // Establecer parametros y ejecutar SP
	    Map<String,Object> data = llamarSP.execute(parametros);
	    
	    // Obteniendo el total de filas afectadas al ejecutar SP
	    int totalRegistrosAfectado = (Integer) data.get(TOTAL_FILAS_AFECTADAS);
	        
	    return totalRegistrosAfectado;
	}
	
	public int actualizarVenta(Venta venta){
		logger.info("actualizarVenta");
		
		// Instanciando variable para llamado de SP
	    SimpleJdbcCall llamarSP = new SimpleJdbcCall(jdbcTemplate).withProcedureName(SP_ACTUALIZAR_VENTA);

	    // Estableciendo parametros de entrada al SP
	    SqlParameterSource parametros = new MapSqlParameterSource()
	    								.addValue(PARAM_CODVENTA, venta.getCodVenta())
	    								.addValue(PARAM_ESTADO, venta.getEstado())
	    								.addValue(PARAM_NOTACREDITONUMERO, venta.getNotaCreditoNumero())
	    								.addValue(PARAM_NOTACREDITOSERIE, venta.getNotaCreditoSerie())
	    								.addValue(PARAM_TOTAL,venta.getTotal())
	    								.addValue(PARAM_SUBTOTAL, venta.getSubTotal())
	    								.addValue(PARAM_IGV, venta.getIgv())
	    								.addValue(PARAM_SALDO, venta.getSaldo());
	    
	    // Establecer parametros y ejecutar SP
	    Map<String,Object> data = llamarSP.execute(parametros);
	    
	    // Obteniendo el total de filas afectadas al ejecutar SP
	    int totalRegistrosAfectado = (Integer) data.get(TOTAL_FILAS_AFECTADAS);
	    
	    //-----------------------------------------
	    //borrar lineas de venta
	    totalRegistrosAfectado += limpiarVentaDetalle (venta);
	    
	    // Obteniendo lineas de la Venta
	    ListaLineaVenta listaLineaVenta = venta.getListaLineaVenta();
	    int iNumeroLinea = 1;
	    for (LineaVenta lineaVenta : listaLineaVenta.getLista()){
	    	// Estableciendo el codigo de venta de la linea
	    	lineaVenta.setCodVenta(venta.getCodVenta());
	    	
	    	// Instanciando variable para llamado de SP
		    SimpleJdbcCall llamarSPLineas = new SimpleJdbcCall(jdbcTemplate).withProcedureName(SP_REGISTRAR_DET_VENTA);
		    // Estableciendo parametros de entrada al SP
		    SqlParameterSource parametrosDetalle = new MapSqlParameterSource()
					    								.addValue(PARAM_CODVENTA, lineaVenta.getCodVenta())
					    								.addValue(PARAM_DET_NROLINEA, iNumeroLinea)
					    								.addValue(PARAM_DET_CODPRODUCTO, lineaVenta.getProducto().getCodigo())
					    								.addValue(PARAM_DET_CANTIDAD, lineaVenta.getCantidad())
					    								.addValue(PARAM_DET_PRECIO, lineaVenta.getPrecio());
		    
		    // Establecer parametros y ejecutar SP
		    Map<String,Object> dataDetalle = llamarSPLineas.execute(parametrosDetalle);
		    
		    // Obteniendo numero de linea
		    //int numeroLinea = (Integer)dataDetalle.get(PARAM_DET_NROLINEA);
		    int numeroLinea = iNumeroLinea;
		    
		    // Obteniendo el total de filas afectadas al ejecutar SP
		    totalRegistrosAfectado += (Integer) dataDetalle.get(TOTAL_FILAS_AFECTADAS);
		    
		    // Instanciando variable para llamado de SP
		    SimpleJdbcCall llamarSPLineasItem = new SimpleJdbcCall(jdbcTemplate).withProcedureName(SP_REGISTRAR_DET_VENTA_ITEM);
		    
	    	for (LineaVentaItem lineaVentaItem : lineaVenta.getListaLineaVentaItem().getLista()){
	    		// Estableciendo el numero de la linea
	    		lineaVentaItem.setNumeroLinea(numeroLinea);
	    		
	    		// Estableciendo parametros de entrada al SP
			    SqlParameterSource parametrosDetalleItem = new MapSqlParameterSource()
						    								.addValue(PARAM_CODVENTA, lineaVenta.getCodVenta())
						    								.addValue(PARAM_DET_NROLINEA, lineaVentaItem.getNumeroLinea())
						    								.addValue(PARAM_ITEM_CODITEM, lineaVentaItem.getItem().getCodItem());
			    
			    // Establecer parametros y ejecutar SP
			    Map<String,Object> dataDetalleItem = llamarSPLineasItem.execute(parametrosDetalleItem);
			    
			    // Obteniendo el total de filas afectadas al ejecutar SP
			    totalRegistrosAfectado += (Integer) dataDetalleItem.get(TOTAL_FILAS_AFECTADAS);
			    
			    // Actualizar Item de prestamo
			    totalRegistrosAfectado += actualizarEstadoItem(lineaVentaItem.getItem());
	    	}
	    	iNumeroLinea ++;
	    }
	    
	    
	    //---------------------------------------
	        
	    return totalRegistrosAfectado;
	}
	
	public int limpiarVentaDetalle(Venta venta){
		logger.info("limpiarVentaDetalle");
        
		int resultado = 0;
		
		// Instanciando variable para llamado de SP Eliminar items registrados en transferencia pasadas
	    SimpleJdbcCall llamarSPLimpiarVentaDetalle = new SimpleJdbcCall(jdbcTemplate).withProcedureName(SP_LIMPIAR_VENTA_DETALLE);
	    // Agregar parametro codigo de cliente
	    llamarSPLimpiarVentaDetalle.execute(new MapSqlParameterSource()
										     .addValue(PARAM_CODVENTA, venta.getCodVenta()));
    		    
	    return resultado;
	}
	
	@Override
	public ListaFacturacion listarFactura(Venta venta) {
		logger.info("listarFactura");

		// Instanciando variable para llamado de SP
	    SimpleJdbcCall llamarSP = new SimpleJdbcCall(jdbcTemplate).withProcedureName(SP_LISTAR_FACTURA).
	    						  returningResultSet(LISTADO, new RowMapper<Facturacion>(){
									@Override
									public Facturacion mapRow(final ResultSet rs, final int numRow) throws SQLException
								    {
								        final Facturacion facturacion = new Facturacion();
								        
								        facturacion.setCodFactura(rs.getInt(FACTURACION_CODFACTURACION));
								        facturacion.setNumero(rs.getString(FACTURACION_NUMERO));
								        facturacion.setSerie(rs.getString(FACTURACION_SERIE));
								        facturacion.setEstado(rs.getString(FACTURACION_ESTADO));
								        facturacion.setFechaRegistro(rs.getDate(FACTURACION_FECHAREGISTRO).toString());
								        
								        FormaVenta formaVenta = new FormaVenta();
								        formaVenta.setCodigo(rs.getInt(FACTURACION_CODFORMAVENTA));
								        formaVenta.setDescripcion(rs.getString(FACTURACION_DESFORMAVENTA));
								        facturacion.setFormaVenta(formaVenta);
								        
								        Moneda moneda = new Moneda();
								        moneda.setCodigo(rs.getInt(FACTURACION_CODMONEDA));
								        moneda.setDescripcion(rs.getString(FACTURACION_MONEDA));
								        moneda.setSimbolo(rs.getString(FACTURACION_SIMBOLO));
								        facturacion.setMoneda(moneda);
								        
								        facturacion.setTotalFacturacion(rs.getDouble(FACTURACION_TOTAL));
								        facturacion.setSubTotalFacturacion(rs.getDouble(FACTURACION_SUBTOTAL));
								        facturacion.setIgvFacturacion(rs.getDouble(FACTURACION_IGV));
								        
								        TipoDocumentoVenta tipoDocumentoVenta = new TipoDocumentoVenta();
								        tipoDocumentoVenta.setCodigo(rs.getInt(FACTURACION_CODTIPODOCUMENTOVENTA));
								        tipoDocumentoVenta.setDescripcion(rs.getString(TIPO_DOCUMENTO_VENTA_DESCRIPCION));
								        facturacion.setTipoDocumentoVenta(tipoDocumentoVenta);
								        
								        Tienda tiendaFacturacion = new Tienda();
								        tiendaFacturacion.setCodigo(rs.getInt(FACTURACION_CODTIENDA));
								        tiendaFacturacion.setDescripcion(rs.getString(FACTURACION_NOMBRETIENDA));
								        facturacion.setTiendaFacturacion(tiendaFacturacion);
								        
								        Usuario usuario = new Usuario();
								        usuario.setCodUsuario(rs.getInt(FACTURACION_CODUSUARIO));
								        usuario.setNombresyApellidos(rs.getString(USUARIO_NOMBRESYAPELLIDOS));
								        facturacion.setUsuario(usuario);
								        
								        return facturacion;
								    }
	    						  }	);

	    // Estableciendo parametros de entrada al SP
	    SqlParameterSource parametros = new MapSqlParameterSource()
	    								.addValue(PARAM_CODVENTA, venta.getCodVenta())
	    								.addValue(PARAM_CODCLIENTE, venta.getCliente().getCodCliente())
	    								.addValue(PARAM_ESTADO, venta.getEstado()); 

	    // Establecer parametros y ejecutar SP
        Map<String,Object> data = llamarSP.execute(parametros);

        // Obteniendo lista generada de ejecutar SP
		@SuppressWarnings("unchecked")
		List<Facturacion> listaFacturacion = (List<Facturacion>)data.get(LISTADO);
        
		// Instanciando objeto ListaFacturacion
		ListaFacturacion listaFacturacionResultado = new ListaFacturacion();
        // Estableciendo resultado al objeto listaFacturacionResultado
		listaFacturacionResultado.setLista(listaFacturacion);
        
        if (logger.isDebugEnabled() && listaFacturacionResultado != null)
        {
            logger.debug("size=" + listaFacturacionResultado.size());
        }
        
        return listaFacturacionResultado;
	}
	
	@Override
	public Facturacion obtenerFactura(Facturacion factura) {
		logger.info("obtenerFactura");

		// Instanciando variable para llamado de SP
	    SimpleJdbcCall llamarSP = new SimpleJdbcCall(jdbcTemplate).withProcedureName(SP_OBTENER_FACTURA).
	    						  returningResultSet(LISTADO, new RowMapper<Facturacion>(){
									@Override
									public Facturacion mapRow(final ResultSet rs, final int numRow) throws SQLException
								    {
								        final Facturacion facturacion = new Facturacion();
								        facturacion.setCodFactura(rs.getInt(FACTURACION_CODFACTURACION));
								        facturacion.setNumero(rs.getString(FACTURACION_NUMERO));
								        facturacion.setSerie(rs.getString(FACTURACION_SERIE));
								        facturacion.setEstado(rs.getString(FACTURACION_ESTADO));
								        facturacion.setFechaRegistro(rs.getDate(FACTURACION_FECHAREGISTRO).toString());
								        
								        FormaVenta formaVenta = new FormaVenta();
								        formaVenta.setCodigo(rs.getInt(FACTURACION_CODFORMAVENTA));
								        formaVenta.setDescripcion(rs.getString(FACTURACION_DESFORMAVENTA));
								        facturacion.setFormaVenta(formaVenta);
								        
								        Moneda moneda = new Moneda();
								        moneda.setCodigo(rs.getInt(FACTURACION_CODMONEDA));
								        moneda.setDescripcion(rs.getString(FACTURACION_MONEDA));
								        moneda.setSimbolo(rs.getString(FACTURACION_SIMBOLO));
								        facturacion.setMoneda(moneda);
								        
								        facturacion.setTotalFacturacion(rs.getDouble(FACTURACION_TOTAL));
								        facturacion.setSubTotalFacturacion(rs.getDouble(FACTURACION_SUBTOTAL));
								        facturacion.setIgvFacturacion(rs.getDouble(FACTURACION_IGV));
								        
								        TipoDocumentoVenta tipoDocumentoVenta = new TipoDocumentoVenta();
								        tipoDocumentoVenta.setCodigo(rs.getInt(FACTURACION_CODTIPODOCUMENTOVENTA));
								        tipoDocumentoVenta.setDescripcion(rs.getString(TIPO_DOCUMENTO_VENTA_DESCRIPCION));
								        facturacion.setTipoDocumentoVenta(tipoDocumentoVenta);
								        
								        Tienda tiendaFacturacion = new Tienda();
								        tiendaFacturacion.setCodigo(rs.getInt(FACTURACION_CODTIENDA));
								        tiendaFacturacion.setDescripcion(rs.getString(FACTURACION_NOMBRETIENDA));
								        facturacion.setTiendaFacturacion(tiendaFacturacion);
								        
								        Usuario usuario = new Usuario();
								        usuario.setCodUsuario(rs.getInt(FACTURACION_CODUSUARIO));
								        usuario.setNombresyApellidos(rs.getString(USUARIO_NOMBRESYAPELLIDOS));
								        facturacion.setUsuario(usuario);
								        
								        return facturacion;
								    }
		    						  })
		    					.returningResultSet(LISTADO_LINEAS_DETFACTURACION, new RowMapper<LineaFacturacion>(){
										@Override
										public LineaFacturacion mapRow(final ResultSet rs, final int numRow) throws SQLException
									    {
									        final LineaFacturacion lineaFacturacion = new LineaFacturacion();
									        
									        lineaFacturacion.setCodFactura(rs.getInt(FACTURACION_CODFACTURACION));
									        lineaFacturacion.setNumeroLinea(rs.getInt(FACTURACION_NROLINEA));
									        lineaFacturacion.setDescripcion(rs.getString(FACTURACION_DETALLELINEA));
									        lineaFacturacion.setCantidad(rs.getInt(FACTURACION_CANTIDAD));
									        lineaFacturacion.setPrecio(rs.getDouble(FACTURACION_PRECIO));
									        
									        return lineaFacturacion;
									    }
		    					});

	    // Estableciendo parametros de entrada al SP
	    SqlParameterSource parametros = new MapSqlParameterSource()
	    								.addValue(PARAM_FACTURA_CODFACTURA, factura.getCodFactura()); 

	    // Establecer parametros y ejecutar SP
        Map<String,Object> data = llamarSP.execute(parametros);

        // Obteniendo lista generada de ejecutar SP
		@SuppressWarnings("unchecked")
		List<Facturacion> listaFactura = (List<Facturacion>)data.get(LISTADO);
        
		// Declarando objeto venta Obtenido
 		Facturacion facturaObtenido = null;
 		
 		if (logger.isDebugEnabled() && listaFactura != null)
        {
            logger.debug("size=" + listaFactura.size());
        }
		
 		if (listaFactura != null && listaFactura.size()>0){
 			// Obteniendo el primer elemento de la lista de venta
 			facturaObtenido = listaFactura.get(0);

 			// Obteniendo lista de lineas-facturacion generada de ejecutar SP
 			@SuppressWarnings("unchecked")
 			List<LineaFacturacion> listaLineaFacturacion = (List<LineaFacturacion>)data.get(LISTADO_LINEAS_DETFACTURACION);

 			// Instanciando objeto ListaLineaVentaItem
 			ListaLineaFacturacion listaLineaFacturacionResultado =  new ListaLineaFacturacion();

 			for(LineaFacturacion lineaFacturacion : listaLineaFacturacion){
 				listaLineaFacturacionResultado.add(lineaFacturacion);
 			}

 			if(listaLineaFacturacionResultado.size()>0){
 				// Asignando lista de facturas al objeto factura creado
 				facturaObtenido.setListaLineaFacturacion(listaLineaFacturacionResultado);
 			}

 			if (logger.isDebugEnabled() && listaLineaFacturacionResultado != null)
 			{
 				logger.debug("sizeLineas=" + listaLineaFacturacionResultado.size());
 			}
 		}

		return facturaObtenido;
	}
	
	@Override
	public Venta buscarFactura(Venta venta) {
		logger.info("buscarFactura");

		// Instanciando variable para llamado de SP
	    SimpleJdbcCall llamarSP = new SimpleJdbcCall(jdbcTemplate).withProcedureName(SP_BUSCAR_FACTURA).
	    						  returningResultSet(LISTADO_LINEAS_FACTURACION, new RowMapper<Facturacion>(){
								  @Override
								  public Facturacion mapRow(final ResultSet rs, final int numRow) throws SQLException
								  {
									  final Facturacion facturacion = new Facturacion();
									  facturacion.setCodFactura(rs.getInt(FACTURACION_CODFACTURACION));
									  facturacion.setNumero(rs.getString(FACTURACION_NUMERO));
									  facturacion.setSerie(rs.getString(FACTURACION_SERIE));
									  facturacion.setEstado(rs.getString(FACTURACION_ESTADO));
									  facturacion.setFechaRegistro(rs.getDate(FACTURACION_FECHAREGISTRO).toString());

									  FormaVenta formaVenta = new FormaVenta();
									  formaVenta.setCodigo(rs.getInt(FACTURACION_CODFORMAVENTA));
									  formaVenta.setDescripcion(rs.getString(FACTURACION_DESFORMAVENTA));
									  facturacion.setFormaVenta(formaVenta);

									  Moneda moneda = new Moneda();
									  moneda.setCodigo(rs.getInt(FACTURACION_CODMONEDA));
									  moneda.setDescripcion(rs.getString(FACTURACION_MONEDA));
									  moneda.setSimbolo(rs.getString(FACTURACION_SIMBOLO));
									  facturacion.setMoneda(moneda);

									  facturacion.setTotalFacturacion(rs.getDouble(FACTURACION_TOTAL));
									  facturacion.setSubTotalFacturacion(rs.getDouble(FACTURACION_SUBTOTAL));
									  facturacion.setIgvFacturacion(rs.getDouble(FACTURACION_IGV));

									  TipoDocumentoVenta tipoDocumentoVenta = new TipoDocumentoVenta();
									  tipoDocumentoVenta.setCodigo(rs.getInt(FACTURACION_CODTIPODOCUMENTOVENTA));
									  tipoDocumentoVenta.setDescripcion(rs.getString(TIPO_DOCUMENTO_VENTA_DESCRIPCION));
									  facturacion.setTipoDocumentoVenta(tipoDocumentoVenta);

									  Tienda tiendaFacturacion = new Tienda();
									  tiendaFacturacion.setCodigo(rs.getInt(FACTURACION_CODTIENDA));
									  tiendaFacturacion.setDescripcion(rs.getString(FACTURACION_NOMBRETIENDA));
									  facturacion.setTiendaFacturacion(tiendaFacturacion);

									  Usuario usuario = new Usuario();
									  usuario.setCodUsuario(rs.getInt(FACTURACION_CODUSUARIO));
									  usuario.setNombresyApellidos(rs.getString(USUARIO_NOMBRESYAPELLIDOS));
									  facturacion.setUsuario(usuario);

									  return facturacion;
								  }
	    						  })
	    						  .returningResultSet(LISTADO_LINEAS_DETFACTURACION, new RowMapper<LineaFacturacion>(){
	    							  @Override
	    							  public LineaFacturacion mapRow(final ResultSet rs, final int numRow) throws SQLException
	    							  {
	    								  final LineaFacturacion lineaFacturacion = new LineaFacturacion();

	    								  lineaFacturacion.setCodFactura(rs.getInt(FACTURACION_CODFACTURACION));
	    								  lineaFacturacion.setNumeroLinea(rs.getInt(FACTURACION_NROLINEA));
	    								  lineaFacturacion.setDescripcion(rs.getString(FACTURACION_DETALLELINEA));
	    								  lineaFacturacion.setCantidad(rs.getInt(FACTURACION_CANTIDAD));
	    								  lineaFacturacion.setPrecio(rs.getDouble(FACTURACION_PRECIO));

	    								  return lineaFacturacion;
	    							  }
	    						  });

	    // Estableciendo parametros de entrada al SP
	    SqlParameterSource parametros = new MapSqlParameterSource()
	    .addValue(PARAM_CODVENTA, venta.getCodVenta());

	    // Establecer parametros y ejecutar SP
	    Map<String,Object> data = llamarSP.execute(parametros);

	    // Obteniendo lista generada de ejecutar SP
	    // Declarando objeto venta Obtenido
	    Venta ventaObtenido = null;
	    ventaObtenido = venta;
	    // --------------------------------------------------------------------------------------------
	    // Obteniendo lista de lineas generada de ejecutar SP
	    @SuppressWarnings("unchecked")
	    List<Facturacion> listaFactura = (List<Facturacion>)data.get(LISTADO_LINEAS_FACTURACION);
	    // Instanciando objeto listaLineaFacturacion
	    ListaFacturacion listaFacturacionResultado = new ListaFacturacion();
	    // Estableciendo resultado al objeto listaLineaFacturacionResultado
	    listaFacturacionResultado.setLista(listaFactura);
	    // --------------------------------------------------------------------------------------------

	    // Obteniendo lista de lineas-facturacion generada de ejecutar SP
	    @SuppressWarnings("unchecked")
	    List<LineaFacturacion> listaLineaFacturacion = (List<LineaFacturacion>)data.get(LISTADO_LINEAS_DETFACTURACION);

	    for (Facturacion facturacion : listaFacturacionResultado.getLista()){

	    	// Instanciando objeto ListaLineaVentaItem
	    	ListaLineaFacturacion listaLineaFacturacionResultado =  new ListaLineaFacturacion();

	    	for(LineaFacturacion lineaFacturacion : listaLineaFacturacion){
	    		if( lineaFacturacion.getCodFactura() == facturacion.getCodFactura()){
	    			listaLineaFacturacionResultado.add(lineaFacturacion);
	    		}
	    	}

	    	if(listaLineaFacturacionResultado.size()>0){
	    		facturacion.setListaLineaFacturacion(listaLineaFacturacionResultado);
	    	}
	    }
	    // --------------------------------------------------------------------------------------------
	    // Asignando lista de facturas al objeto venta creado

	    ventaObtenido.setListaFacturacion(listaFacturacionResultado);
	    // --------------------------------------------------------------------------------------------

	    if (logger.isDebugEnabled() && listaFacturacionResultado != null)
	    {
	    	logger.debug("sizeLineas=" + listaFacturacionResultado.size());
	    }

	    return ventaObtenido;
	}
	
	@Override
	public boolean registrarFactura(Venta venta, Facturacion factura) {
		logger.info("registrarFactura");
		
		int resultado = 0;
		
		// Instanciando variable para llamado de SP
	    SimpleJdbcCall llamarSP = new SimpleJdbcCall(jdbcTemplate).withProcedureName(SP_REGISTRAR_FACTURA);

	    // Estableciendo parametros de entrada al SP
	    SqlParameterSource parametros = new MapSqlParameterSource()
	    								.addValue(PARAM_SERIE, factura.getSerie())
	    								.addValue(PARAM_NUMERO, factura.getNumero())
	    								.addValue(PARAM_CODVENTA, venta.getCodVenta())
	    								.addValue(PARAM_CODTIPODOCUMENTOVENTA, factura.getTipoDocumentoVenta().getCodigo())
	    								.addValue(PARAM_CODMONEDA, factura.getMoneda().getCodigo())
	    								.addValue(PARAM_CODFORMAVENTA, factura.getFormaVenta().getCodigo())
	    								.addValue(PARAM_FACTURA_TOTALFACTURA, factura.getTotalFacturacion())
	    								.addValue(PARAM_SUBTOTAL, factura.getSubTotalFacturacion())
	    								.addValue(PARAM_FACTURA_IGVFACTURA, factura.getIgvFacturacion())
	    								.addValue(PARAM_CODUSUARIO, factura.getUsuario().getCodUsuario())
	    								.addValue(PARAM_ESTADO, factura.getEstado())
	    								.addValue(PARAM_CODTIENDA, factura.getTiendaFacturacion().getCodigo());
	    
	    
	    // Establecer parametros y ejecutar SP
	    Map<String,Object> data = llamarSP.execute(parametros);
	    
	    // Obteniendo el total de filas afectadas al ejecutar SP
	    resultado += (Integer) data.get(TOTAL_FILAS_AFECTADAS);
	    
	    logger.debug("codigo generado:" + data.get(PARAM_FACTURA_CODFACTURA));

	    // Obteniendo codigo de venta
	    int codigoFactura = (Integer)data.get(PARAM_FACTURA_CODFACTURA);

	    // Estableciendo codigo generado
	    factura.setCodFactura(codigoFactura);
	    
	    // Obteniendo lineas de la Venta
	    ListaLineaFacturacion listaLineaFactura = factura.getListaLineaFacturacion();
	    int iNumeroLinea = 1;
	    for (LineaFacturacion lineaFactura : listaLineaFactura.getLista()){
	    	// Estableciendo el codigo de venta de la linea
	    	lineaFactura.setCodFactura(factura.getCodFactura());
	    	
	    	// Instanciando variable para llamado de SP
		    SimpleJdbcCall llamarSPLineas = new SimpleJdbcCall(jdbcTemplate).withProcedureName(SP_REGISTRAR_DET_FACTURA);
		    // Estableciendo parametros de entrada al SP
		    SqlParameterSource parametrosDetalle = new MapSqlParameterSource()
					    								.addValue(PARAM_FACTURA_CODFACTURA, lineaFactura.getCodFactura())
					    								.addValue(PARAM_DET_NROLINEA, iNumeroLinea)
					    								.addValue(PARAM_FACTURA_DETALLELINEA, lineaFactura.getDescripcion())
					    								.addValue(PARAM_DET_CANTIDAD, lineaFactura.getCantidad())
					    								.addValue(PARAM_DET_PRECIO, lineaFactura.getPrecio());
		    
		    // Establecer parametros y ejecutar SP
		    Map<String,Object> dataDetalle = llamarSPLineas.execute(parametrosDetalle);
		    
		    // Obteniendo numero de linea
		    
		    // Obteniendo el total de filas afectadas al ejecutar SP
		    resultado += (Integer) dataDetalle.get(TOTAL_FILAS_AFECTADAS);
		    iNumeroLinea ++;
	    	}
	    	
	    return resultado > 0;
	}
	
	public int modificarFactura(Facturacion factura){
		logger.info("modificarFactura");
		
		// Instanciando variable para llamado de SP
	    SimpleJdbcCall llamarSP = new SimpleJdbcCall(jdbcTemplate).withProcedureName(SP_MODIFICAR_FACTURA);

	    // Estableciendo parametros de entrada al SP
	    SqlParameterSource parametros = new MapSqlParameterSource()
	    								.addValue(PARAM_FACTURA_CODFACTURA, factura.getCodFactura())
	    								.addValue(PARAM_ESTADO, factura.getEstado());
	    
	    // Establecer parametros y ejecutar SP
	    Map<String,Object> data = llamarSP.execute(parametros);
	    
	    // Obteniendo el total de filas afectadas al ejecutar SP
	    int totalRegistrosAfectado = (Integer) data.get(TOTAL_FILAS_AFECTADAS);
	        
	    return totalRegistrosAfectado;
	}
}
